def sayHi():
    print("大家好，我叫张三")
    print("我今年25岁")
    print("我从事java开发工程师的工作")
    pass
sayHi()
sayHi()
sayHi()
# 思考？如何在打招呼时，输出的信息因为对象信息不同，输出的结果也不同？
# 参数可以解决如上问题
def sayHello(name,age,work):
    print("大家好，我叫{}".format(name))
    print("我今年{}岁".format(age))
    print("我从事{}的工作".format(work))
#     必选参数（位置参数）
# 必选参数在设计时，怎么设计参数，调用时，就需要怎样传参
sayHello("tom",22,"java开发工程师")
sayHello("tony",25,"C#开发工程师")
sayHello("王五",28,"Python开发工程师")
# 缺省参数
def sum(a=6,b=8):
    print(a)
    print(b)
    print(a+b)
    pass
# 缺省参数在调用时，可以传值，也可以不传值
# 若不传值，则表示使用在函数定义时的默认值
sum()
# 传值后，则将函数定义时指定的默认值覆盖，使用传入的参数的值
sum(5,12)
# 不定长参数、可变参数
def count(*args):
    print(type(args))
    pass
# 在使用时，可以传入0~n个参数，默认将参数存入到一个元组中
count(1,6,9)
# 关键字参数 可以传入key-value作为参数
def getMsg(**kwargs):
    print(type(kwargs))
#     使用时，会默认将参数存入到字典中
getMsg(name="tom",age=22,sex=True)
dict={"name":"tony","age":26}
# 若传入的参数是一个字典类型的内容，需要在变量前加上**
getMsg(**dict)
# 如果参设计中
# 如果必选参数与缺省参数同时存在，需要将缺省参数放在必选参数的后面
def sub(a,b=0):
    print(a-b)
    pass
sub(10)
sub(10,2)
# 当可变参数与关键字参数同时出现
# 可变参数要放在关键字参数的前面
def showMessage(*args,**kwargs):
    print(args)
    print(kwargs)
    pass
# 函数中是否有返回值，取决于内部是否有return操作
# 若函数内部没有return，在打印时，会输出None值
print(sum())
def getSum(*args):
    sum=0
    for i in args:
        sum+=i
    return sum
# 函数中若有return操作，打印时，则输出的结果为return后的数据
print(getSum(1,9,2,8))
# 函数中若存在多个返回值
def moreMsg():
    return 1,2,3,4
print(moreMsg())
print(type(moreMsg()))

# 函数的嵌套
# 函数的嵌套应用
def innerFun():
    print("我是内层的函数-----------start")
    print("内层函数中间的代码部分")
    print("内层函数-------------------end")
    pass
def outterFun():
    "这是嵌套函数的讲解"
    print("我是外层的函数-----------start")
    print("外层函数中间的代码部分")
    innerFun()
    print("外层函数-------------------end")
    pass
outterFun()